import fitz  # pymupdf的核心库


def generate_pdf_resume(resume_json, output_path="Python开发工程师简历.pdf"):
    """
    用pymupdf直接生成PDF格式简历
    :param resume_json: 千问返回的简历字典
    :param output_path: PDF输出路径
    :return: True（成功）/False（失败）
    """
    try:
        # 1. 创建空白PDF文档（基础教学案例1的用法）
        pdf_doc = fitz.open()
        # 添加A4页面（基础教学案例1的用法）
        page = pdf_doc.new_page(width=fitz.paper_size("a4")[0], height=fitz.paper_size("a4")[1])

        # 2. 基础配置：边距、坐标、字体（基础教学案例1的扩展）
        margin = 50  # 页面边距（左、上、右、下）
        x, y = margin, margin  # 文本渲染起始坐标
        # 字号配置
        font_title = 24  # 简历标题
        font_heading = 16  # 模块标题
        font_content = 11  # 内容文本
        line_spacing = 15  # 行间距（磅）

        # 3. 1. 添加简历标题（居中，基础教学案例1的用法）
        title = "个人简历"
        # 插入标题（不指定特定字体，使用系统默认字体）
        page.insert_text(
            (margin, y),
            title,
            fontsize=font_title,
            color=fitz.utils.getColor("black")
        )
        y += font_title + line_spacing  # 下移，预留间距

        # 3. 2. 基本信息（表格绘制，基础教学案例2的用法）
        # 模块标题
        page.insert_text((x, y), "一、基本信息", fontsize=font_heading,
                         color=fitz.utils.getColor("darkblue"))
        y += font_heading + line_spacing

        basic_info = resume_json["basic_info"]
        basic_items = [
            ("姓名", basic_info["name"]),
            ("性别", basic_info["gender"]),
            ("联系电话", basic_info["phone"]),
            ("电子邮箱", basic_info["email"]),
            ("求职意向", basic_info["job_intention"])
        ]

        # 表格参数：行高25磅，列宽（左列120，右列自适应）
        row_height = 25
        col1_width = 120
        col2_width = page.rect.width - 2 * margin - col1_width

        # 循环绘制每行表格（基础教学案例2的扩展）
        for label, value in basic_items:
            # 绘制单元格边框（灰色细线）
            rect1 = fitz.Rect(x, y, x + col1_width, y + row_height)
            page.draw_rect(rect1, color=fitz.utils.getColor("gray"), width=0.5)
            rect2 = fitz.Rect(x + col1_width, y, x + col1_width + col2_width, y + row_height)
            page.draw_rect(rect2, color=fitz.utils.getColor("gray"), width=0.5)

            # 插入字段名（粗体，左列居中）
            page.insert_text(
                (x + 10, y + row_height / 2 + 5),
                label,
                fontsize=font_content,
                color=fitz.utils.getColor("black")
            )
            # 插入字段值（常规字体，右列居中）
            page.insert_text(
                (x + col1_width + 10, y + row_height / 2 + 5),
                str(value),
                fontsize=font_content,
                color=fitz.utils.getColor("black")
            )

            y += row_height  # 下移到下一行
        y += line_spacing  # 模块结束预留间距

        # 3. 3. 教育经历、工作经历、技能（复用基础教学逻辑）
        # 教育经历
        page.insert_text((x, y), "二、教育经历", fontsize=font_heading,
                         color=fitz.utils.getColor("darkblue"))
        y += font_heading + line_spacing
        for edu in resume_json["education"]:
            page.insert_text((x, y), f"学校：{edu['school']} | 学历：{edu['degree']} | 专业：{edu['major']}",
                             fontsize=font_content)
            y += line_spacing
            page.insert_text((x, y), f"时间：{edu['time']}", fontsize=font_content)
            y += line_spacing
            page.insert_text((x, y), f"荣誉：{edu['honors']}", fontsize=font_content)
            y += line_spacing * 2

        # 工作经历（带圆形项目符号，基础教学案例2的用法）
        page.insert_text((x, y), "三、工作经历", fontsize=font_heading,
                         color=fitz.utils.getColor("darkblue"))
        y += font_heading + line_spacing
        for work in resume_json["work_experience"]:
            page.insert_text((x, y), f"公司：{work['company']} | 职位：{work['position']} | 时间：{work['time']}",
                             fontsize=font_content)
            y += line_spacing

            # 核心职责（圆形项目符号）
            page.insert_text((x, y), "核心职责：", fontsize=font_content)
            y += line_spacing
            for resp in work["responsibilities"]:
                # 绘制圆形符号（基础教学案例2的用法）
                page.draw_circle((x + 10, y + 6), radius=2, color=fitz.utils.getColor("gray"), fill=True)
                # 插入职责文本（缩进15磅）
                page.insert_text((x + 15, y + 10), resp, fontsize=font_content)
                y += line_spacing

            # 工作成果（同职责格式）
            page.insert_text((x, y), "工作成果：", fontsize=font_content)
            y += line_spacing
            for ach in work["achievements"]:
                page.draw_circle((x + 10, y + 6), radius=2, color=fitz.utils.getColor("gray"), fill=True)
                page.insert_text((x + 15, y + 10), ach, fontsize=font_content)
                y += line_spacing
            y += line_spacing * 2

        # 3. 4. 专业技能与自我评价（简化实现）
        # 专业技能
        page.insert_text((x, y), "四、专业技能", fontsize=font_heading,
                         color=fitz.utils.getColor("darkblue"))
        y += font_heading + line_spacing
        skills = resume_json["skills"]
        skill_labels = {"programming_language": "编程语言", "framework": "开发框架", "database": "数据库",
                        "tools": "工具"}
        for key, label in skill_labels.items():
            page.insert_text((x, y), f"{label}：{', '.join(skills[key])}", fontsize=font_content)
            y += line_spacing

        # 自我评价
        y += line_spacing
        page.insert_text((x, y), "五、自我评价", fontsize=font_heading,
                         color=fitz.utils.getColor("darkblue"))
        y += font_heading + line_spacing
        for eval_text in resume_json["self_evaluation"]:
            page.draw_circle((x + 10, y + 6), radius=2, color=fitz.utils.getColor("gray"), fill=True)
            page.insert_text((x + 15, y + 10), eval_text, fontsize=font_content)
            y += line_spacing

        # 4. 保存PDF文档（基础教学案例1的用法）
        pdf_doc.save(output_path)
        pdf_doc.close()
        print(f"✅ PDF简历生成成功，路径：{output_path}")
        return True

    except Exception as e:
        print(f"❌ PDF生成失败：{e}")
        return False
